perm filename STEP.6[DOC,TOB] blob
sn#082209 filedate 1974-01-07 generic text, type T, neo UTF8
00100 comment this file generates fake edges in an array;
00200
00300
00400
00500 comment conditional assembly to compile file only once;
00600 IFCR ¬DECLARATION(FAKE_COMPILED) THENC
00700 DEFINE FAKE_COMPILED=1;
00800 comment flag used to prevent reading file twice;
00900 comment
01000 this package generates fake edges in an array
01100 The variables involved are:
01200 BITS number of bits per byte
01300 STEP_FAKE the step half height
01400 RATIO_FAKE fractional half height
01500 STEP_FAKE←RATIO_FAKE*NOISE_FAKE
01600 MEAN_FAKE mean value of step
01700 NOISE_FAKE rms error of gaussian noise
01800
01900 THETA_FAKE angle of edge
02000 THETA_FAKE←THETA0_FAKE+DTHETA_FAKE*(RANDOM-.5)
02100 DTHETA_FAKE interval of random theta variation
02200 THETA0_FAKE center value of theta
02300
02400 RHO_FAKE perpendicular distance of edge
02500 RHO_FAKE←RHO0_FAKE+DRHO_FAKE*(RANDOM-.5)
02600 DRHO_FAKE interval of random rho variation
02700 RHO0_FAKE center value of rho
02800 LAMBDA_FAKE the wavelength transverse to edge
02900 INTENSITY_FAKE array of fake INTENSITY_FAKE values
03000 NBHD_FAKE size of nbhd (intensity array)
03100
03200 PROCEDURE ASK_FAKE ! asks for values for variables
03300 SIMPLE PROCEDURE ERROR_FAKE(REFERENCE REAL ALPHA,DELTA)
03400 comment gets values for angle,perpendicular distance
03500
03600 the perpendicular distance from the edge is
03700 n→.r→+RHO_FAKE
03800 cx*x+cy*y+RHO_FAKE
03900 in terms of normal;
00100 REQUIRE RANDOM_FILE;
00200 REQUIRE TV_VARIABLES;
00300
00400 DEFINE NBHD_FAKE=8;
00500 SHORT REAL STEP_FAKE; ! half height of fake edge;
00600 SHORT REAL RATIO_FAKE; ! fraction of noise;
00700 comment STEP_FAKE←RATIO_FAKE*NOISE_FAKE;
00800 SHORT REAL MEAN_FAKE; ! mean value at edge;
00900 SHORT REAL NOISE_FAKE; ! rms error of gaussian noise;
01000 SHORT REAL THETA_FAKE; ! angle of fake edge;
01100 comment theta_fake←theta0_fake+dtheta_fake;
01200 SHORT REAL DTHETA_FAKE; ! interval of flat random distribution;
01300 SHORT REAL THETA0_FAKE; ! center value of theta;
01400 SHORT REAL RHO_FAKE; ! normal distance of edge from origin;
01500 comment rho_fake←rho0_fake+drho_fake;
01600 SHORT REAL RHO0_FAKE; ! central value of rho;
01700 SHORT REAL DRHO_FAKE; ! interval of flat random rho distribution;
01800 SHORT REAL LAMBDA_FAKE; ! wavelength transverse to edge;
01900 INTEGER_ARRAY INTENSITY_FAKE[1:NBHD_FAKE*NBHD_FAKE];
02000
02100
02200 PROCEDURE INIT_FAKE;
02300 BEGIN
02400 BITS←9;
02500 TVWORD←GIOWD(INTENSITY_FAKE);
02600 LINLEN←WORDS(NBHD_FAKE,BITS);
02700 IWID←NBHD_FAKE;
02800 LSIDE←1;RSIDE←NBHD_FAKE;
02900 FLINE←1;LLINE←NBHD_FAKE;
03000 RATIO_FAKE←1.0;
03100 MEAN_FAKE←0.5*(2↑BITS-1);
03200 THETA0_FAKE←.5; ! fraction of maximum;
03300 DTHETA_FAKE←1.0; ! fraction of maximum;
03400 RHO0_FAKE←0.5;
03500 DRHO_FAKE←1.0;
03600 LAMBDA_FAKE←1.0;
03700 NOISE_FAKE←5.0;
03800 END;
03900
04000 REQUIRE INIT_FAKE INITIALIZATION;
04100
04800 SHORT REAL PROCEDURE NOISE(SHORT REAL VALUE,NOISE_FAKE);
04900 comment gaussian noise;
05100 RETURN (VALUE+GAUSS*NOISE_FAKE);
05300
05400 SHORT REAL PROCEDURE STEP_FUN(SHORT REAL MEAN_FAKE,
05500 STEP_FAKE,PHASE);
05600 comment step function with linear shift between;
05700 BEGIN "STEP"
05800 IF PHASE>1.0 THEN PHASE←1.0;
05900 IF PHASE<-1.0 THEN PHASE←-1.0;
06000 RETURN (PHASE*STEP_FAKE+MEAN_FAKE);
06100 END "STEP";
06200
06300 SHORT REAL PROCEDURE NOISY_STEP( SHORT REAL MEAN_FAKE,
06400 STEP_FAKE,PHASE,NOISE_FAKE);
06500 comment noisy step function;
06700 RETURN(NOISE(STEP_FUN(MEAN_FAKE,STEP_FAKE,PHASE),NOISE_FAKE));
06900
07100 PROCEDURE ASK_FAKE; ! asks for values for variables;
07105 WHILE YES("CHANGE FAKE VALUES? ") DO BEGIN "ASK_F"
07300 ASK_MODIFY("AMPLITUDE IN UNITS OF NOISE ",RATIO_FAKE);
07400 MODIFY(NOISE_FAKE);
07500 STEP_FAKE←NOISE_FAKE*RATIO_FAKE;
07600 IF STEP_FAKE=0 THEN STEP_FAKE←RATIO_FAKE;
07700 PRINT(STEP_FAKE);
07800 ASK_MODIFY("TRANSVERSE WAVELENGTH (FOR DEFOCUS) ",LAMBDA_FAKE);
07900 MODIFY(RHO0_FAKE);
08000 MODIFY(DRHO_FAKE);
08100 ASK_MODIFY("FRACTION OF MAXIMUM ",THETA0_FAKE);
08200 ASK_MODIFY("FRACTION OF MAXIMUM ",DTHETA_FAKE);
08300 END "ASK_F";
08400
08500
08600
08700 SIMPLE PROCEDURE ERROR_FAKE(REFERENCE REAL ALPHA,DELTA);
08800 BEGIN
08900 REAL COSX,COSY;
09000
09100 ALPHA←ATAN2(CY,CX)-THETA_FAKE;
09200 COSX←COS(THETA_FAKE);
09300 COSY←SIN(THETA_FAKE);
09400 DELTA←COSX*(OPX-NBHD_FAKE/2)+COSY*(OPY-NBHD_FAKE/2)+RHO_FAKE;
09500 END;
00100 comment make a step edge (with funarg possibly)
00200 about a line specified by
00300 THETA_FAKE,RHO_FAKE with wavelength LAMBDA_FAKE;
00400
00500 PROCEDURE FAKE;
00600 BEGIN "FAKE"
00700 REAL X0,Y0,COSX,COSY;
00800 SHORT INTEGER VMAX;
00900 INTEGER PTR; ! byte ptr;
01000 INTEGER ROW,COLUMN;
01100
01200 THETA_FAKE←(THETA0_FAKE+DTHETA_FAKE*(RANDOM-.5))*π/8;
01300 RHO_FAKE←RHO0_FAKE+DRHO_FAKE*(RANDOM-.5);
01400 VMAX←2↑BITS-1;
01500 COSX←COS(THETA_FAKE);
01600 COSY←SIN(THETA_FAKE);
01700 X0←(NBHD_FAKE+1)*0.5;
01800 Y0←(NBHD_FAKE+1)*0.5;
01900 PTR←BPOINT(BITS,INTENSITY_FAKE[1],0);
02000
02100 FOR ROW←1 STEP 1 UNTIL NBHD_FAKE DO BEGIN
02200 SHORT REAL Y1;
02300 INTEGER PTR1;
02400 PTR1←PTR;
02500 PTR←PTR+LINLEN;
02700 Y1←(ROW-Y0)*COSY+RHO_FAKE;
02800 FOR COLUMN←1 STEP 1 UNTIL NBHD_FAKE DO BEGIN
02900 LABEL FKSTR;
03000 SHORT REAL PHASE;
03100 SHORT INTEGER VALUE;
03200 PHASE←(Y1+(COLUMN-X0)*COSX)/LAMBDA_FAKE; ! transverse phase;
03300 comment now calculate fake intensity;
03400 VALUE←0.5+NOISY_STEP(MEAN_FAKE,STEP_FAKE,PHASE,NOISE_FAKE);
03500 comment now round value and check limits, store;
03600 IF VALUE<0 THEN VALUE←0;
03700 IF VALUE>VMAX THEN VALUE←VMAX;
03800 FKSTR: IDPB(VALUE,PTR1);
03900 END;
04000 END;
04100 END "FAKE";
04200
04300
04400
04500 ENDC; ! end of conditional assembly around whole file;